package q7_gc_test;

/*
java -server -Xms1g -Xmx1g -XX:+UseG1GC -jar sprintboot.war

生产环境服务器变慢，诊断思路和性能评估谈谈？
1、整机：top -Hp
    uptime 系统性能命令的精简版
    load average 高于0.6说明有个程序在频繁执行
2、CPU：vmstat
    1、查看CPU（包含不限于）vmstat -n 2 3
        一般vmstat工具的使用是通过两个数字参数来完成的，第一个参数是采样的时间间隔数单位是秒，第二个参数是采样的次数
        - procs
            r: 运行和等待CPU时间片的进程数，原则上1核的CPU的运行队列不要超过2，整个系统的运行队列不能超过总核数的2倍，否则代表系统压力过大。
            b: 等待资源的进程数，比如正在等待磁盘IO、网络IO等。
        - cpu
            us: 用户进程消耗CPU时间百分比，us值高，用户进程消耗CPU时间多，如果长期大于50%，优化程序。
            sy: 内核进程消耗的CPU时间百分比
            us + sy 参考值为80%，如果大于80%，说明可能存在CPU不足。
            id: 处理空闲的CPU百分比
            wa: 系统等待IO的CPU时间百分比
            st: 来自于一个虚拟机偷取的CPU时间的百分比
    2、查看额外
        查看所有CPU核信息 mpstat -P ALL 2
        每个进程使用CPU的用量分解信息 pidstat -u 1 -p 进程编号
3、内存：free
    应用程序可用内存数 free -m
        - 经验值
            应用程序可用内存/系统物理内存>70% 内存充足
            应用程序可用内存/系统物理内存<20% 内存不足，需要增加内存
            20%<应用程序可用内存/系统物理内存<70% 内存基本够用
    查看额外
        pidstat -p 进程号 -r 采样间隔秒数
4、硬盘：df
    查看磁盘剩余空间数：df -h
5、磁盘IO：iostat
    iostat -xdk 2 3
    磁盘块设备分布
        rkB/s 每秒读取数据量kB
        wkB/s 每秒写入数据量kB
        svctm I/O请求的平均服务时间，单位毫秒
        await I/O请求的平均等待时间，单位毫秒，值越小，性能越好
        util 一秒中有百分几的时间用于I/O操作。接近100%时，表示磁盘带宽跑满，需要优化程序或者增加磁盘
        rkB/s、wkB/s 根据系统应用不同会有不同的值，但有规律遵循：长期、越大数据读写，肯定不正常，需要优化程序读取。
        svctm的值与await的值很接近，表示几乎没有I/O等待，磁盘性能好，
        如果await的值远高于svctm的值，则表示I/O队列等待太长，需要优化程序或更换更快磁盘。
    查看额外
        pidstat -d 采样间隔秒数 -p 进程号
6、网络IO：ifstat
    默认本地没有，下载ifstat
    查看网络IO
        各个网卡的in、out
        观察网络负载情况
        程序网络读写是否正常
        - 程序网络IO优化
        - 增加网络IO带宽

假如生产环境出现CPU占用过高，请谈谈你的分析思路和定位？
1、结合Linux和JDK命令一块分析
2、案例步骤
    1、先用top命令找出CPU占比最高的
    2、ps -ef或者jps进一步定位，得知是一个怎么样的一个后台程序给我们惹事
        jps -l
        ps -ef | grep java | grep -v grep
    3、定位到具体线程或者代码
        ps -mp 进程 -o THREAD,tid,time
        参数解释：
            -m 显示所有的线程
            -p pid 进程使用CPU的时间
            -o 该参数后是用户自定义格式
    4、将需要的线程ID转换为16进制格式（英文大小写格式）
        printf "%x\n" 有问题的线程ID
    5、jstack 进程ID | grep tid(16进制线程ID小写英文) —A60

对于JDK自带的JVM监控和性能分析工具用过哪些？
1、是什么
    https://docs.oracle.com/javase/8/docs/technotes/tools/unix/index.html
2、性能监控工具
    jps
    jinfo
    jstat
    jmap
    jhat
    jstack
    jconsole
    jvisualvm
 */
public class PerformanceTuning {

    public static void main(String[] args) {

    }

}
